        SUBT    > <wini>arm.NewEmulate.EmuDebug

 [ debug
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

key1_a500       * a500key_Alt
key2_a500       * a500key_Shift

key1_a1         * a1key_LeftAlt
key2_a1         * a1key_LeftCtrl

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Entered in some mode or other, probably IRQ

DebugEventCode ROUT

        CMP     r0, #Event_Keyboard
        MOVNE   pc, lr                  ; Pass it on if wrong event

; In    r1 = key down = 1, key up = 0
;       r2 = key number
;       r3 = 0 -> a500, 1.. -> a1

        CMP     r3, #0                  ; a500 ?
        MOVEQ   r0, #key1_a500
        MOVNE   r0, #key1_a1
        CMP     r0, r2
        STREQ   r1, [wp, #Key1State]    ; 0 -> key is now up
        MOVEQ   r0, #Event_Keyboard
        MOVEQS  pc, lr

        CMP     r3, #0                  ; a500 ?
        MOVEQ   r0, #key2_a500
        MOVNE   r0, #key2_a1
        CMP     r0, r2
        STREQ   r1, [wp, #Key2State]    ; 0 -> key is now up

        MOV     r0, #Event_Keyboard
        MOVS    pc, lr

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    r0-r6 trashable

DebugLevel_CommandCode ENTRY

        LDR     wp, [r12]

        CMP     r1, #0                  ; No arg ?
        BEQ     %FT50

        MOV     r1, r0
        MOV     r0, #16 + (2_100 :SHL: 29) ; Bad term error
        SWI     XOS_ReadUnsigned

        STRVC   r2, [wp, #debuglevel]
        EXIT


; Report DebugLevel

50      SWI     XOS_WriteS
        DCB     "Current DebugLevel = &", 0
        ALIGN
        LDRVC   r0, [wp, #debuglevel]
        DREG    r0
        EXIT


DebugLevel_CommandHelp
        DCB     "*DebugLevel sets a new debug level for the 6502 emulator."
        DCB     CR
DebugLevel_CommandSyntax
        DCB     "Syntax: *DebugLevel [<hex_number>]", 0
        ALIGN

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Do opcode debug, preserving current state

ForceOpcodeDebug ENTRY "JV"

        GetWS
        LDR     r14, [wp, #debuglevel]
        Push    r14

        ORR     r14, r14, #debug_opcode
        STR     r14, [wp, #debuglevel]

        BL      DebugOpcode

        Pull    r14
        STR     r14, [wp, #debuglevel]
        EXITS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Debug the current 6502 opcode

; In    P = @(opcode+1) +MR

; Out   Registers and flags preserved

DebugOpcode ENTRY "r0-r2, JV" ; NB. Do NOT change without altering stack peeks

        GetWS
        LDR     r14, [wp, #debuglevel]
        TST     r14, #debug_opcode
        BEQ     %FT50

        TST     r14, #debug_noirq       ; Allowing IRQ debug ?
        BEQ     %FT10

        TST     OtherFlags, #I_bit_6502 ; If IRQOff and no IRQ debug, exit
        EXITS   NE

10      LDR     r14, [sp, #4*4]         ; Restore flags from stcked lr
        TEQP    r14, #0                 ; {r0,r1,r2,JV,lr}

        BL      DoOpcodeDebug

50 ; Always test 'escape' keys after display

        LDR     r14, [wp, #Key1State]
        TEQ     r14, #0                 ; Key 1 up ?
        LDRNE   r14, [wp, #Key2State]
        TEQNE   r14, #0                 ; Key 2 up ?
        EXITS   EQ


; Broken into opcode fetch

        LDR     r14, [wp, #debuglevel]  ; Already displayed ?
        TST     r14, #debug_opcode
        BNE     %FT70

        LDR     r14, [sp, #4*4]         ; Restore flags from stcked lr
        TEQP    r14, #0                 ; {r0,r1,r2,JV,lr}

        BL      DoOpcodeDebug

70

; .............................................................................
; Errors can go phooey; I can't really cope with 'em here

Debug_StarLoop
        MOV     r0, #15                 ; Flush input buffer
        MOV     r1, #0
        SWI     XOS_Byte

        SWI     XOS_WriteS
        DCB     "EmuDebug *",0
        ALIGN

        ADD     r0, wp, #ReadLineBuffer
        MOV     r1, #?ReadLineBuffer-1
        MOV     r2, #space
        MOV     r3, #&FF
        SWI     XOS_ReadLine
        BVS     Debug_Error
        BCS     Debug_AckEscape

        CMP     r1, #0                  ; Null line -> continue 6502 execution
        BEQ     Debug_Ending

        ADD     r0, wp, #ReadLineBuffer
        SWI     XOS_CLI
        BVC     Debug_StarLoop

Debug_Error
        SWI     XOS_WriteS
        DCB     "*** Error: ", 0
        ALIGN
        ADD     r0, r0, #4
        SWI     XOS_Write0
        SWI     XOS_NewLine
        B       Debug_StarLoop


Debug_Ending
        SWI     XOS_WriteS
        DCB     11                      ; Erase last prompt
        DCB     "          ", CR
        DCB     0
        ALIGN
        EXITS


Debug_AckEscape
        MOV     r0, #&7E
        SWI     XOS_Byte
        B       Debug_StarLoop
 ]

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Assumes P -> opcode.

; Normally called when ABORT executed in main CPU or whilst debug on

DoOpcodeDebug ENTRY "r0-r2"

        STRIM   "Op "
        LDRB    r1, [P]
        BL      BYTEHX
        STRIM   " "
        LDRB    r1, [P, #1]             ; Display two bytes following opcode
        BL      BYTEHX
        STRIM   "  "
        LDRB    r1, [P, #2]
        BL      BYTEHX
        STRIM   " A "
        MOV     r1, A, LSR #24
        BL      BYTEHX
        STRIM   " X "
        MOV     r1, X, LSR #24
        BL      BYTEHX
        STRIM   " Y "
        MOV     r1, Y, LSR #24
        BL      BYTEHX
        STRIM   " S 1"
        MOV     r1, S
        BL      BYTEHX
        STRIM   " PC "
        SUB     r1, P, MR
        BL      HWRDHX
 [ fullbbc
        STRIM   "/"
        GetWS
        LDRB    r1, [wp, #ROMLatchCopy]
        BL      BYTEHX
 ]
        STRIM   " "
        LDR     r1, [sp, #4*3]          ; Look at stacked psr bits
        TST     r1, #N_bit
        SWIEQ   XOS_WriteI+"n"
        SWINE   XOS_WriteI+"N"
        TST     r1, #V_bit
        SWIEQ   XOS_WriteI+"v"
        SWINE   XOS_WriteI+"V"
        TST     OtherFlags, #D_bit_6502
        SWIEQ   XOS_WriteI+"d"
        SWINE   XOS_WriteI+"D"
        TST     OtherFlags, #I_bit_6502
        SWIEQ   XOS_WriteI+"i"
        SWINE   XOS_WriteI+"I"
        TST     r1, #Z_bit
        SWIEQ   XOS_WriteI+"z"
        SWINE   XOS_WriteI+"Z"
        TST     r1, #C_bit
        SWIEQ   XOS_WriteI+"c"
        SWINE   XOS_WriteI+"C"

 [ :LNOT: debug
        SWI     XOS_NewLine
        EXITS
 |
        LDRB    r14, [P]                ; Get opcode once more
        ADR     r1, DisasmOpcodeTable
        ADD     r1, r1, r14, LSL #3
        MOV     r0, r1
        SWI     XOS_WriteI+space
        SWIVC   XOS_Write0

        LDRB    r0, [r1, #6]            ; Disasm type
        ADD     pc, pc, r0, LSL #2
        NOP

        ^       0
t_Imp   #       1
        B       Opcode_Imp
t_IM    #       1
        B       Opcode_IM
t_Rel   #       1
        B       Opcode_Rel
t_Abs   #       1
        B       Opcode_Abs
t_AX    #       1
        B       Opcode_AX
t_AY    #       1
        B       Opcode_AY
t_Z     #       1
        B       Opcode_Z
t_ZX    #       1
        B       Opcode_ZX
t_ZY    #       1
        B       Opcode_ZY
t_I     #       1
        B       Opcode_I
t_IX    #       1
        B       Opcode_IX
t_IY    #       1
        B       Opcode_IY
t_One   #       1
        B       Opcode_One


Opcode_Imp

DisplayNoArg

        SWI     XOS_NewLine
        EXITS

; .............................................................................

Opcode_IM
Opcode_Z
Opcode_ZX
Opcode_ZY
Opcode_I
Opcode_IX
Opcode_IY
Opcode_One
        LDRB    r1, [P, #1]

; .............................................................................
; In    r1 = byte

DisplayByteArg

        SWI     XOS_WriteI+space
        SWI     XOS_WriteI+"&"
        BL      BYTEHX
        SWI     XOS_NewLine
        EXITS


Opcode_Rel
        LDRB    r1, [P, #1]
        MOV     r1, r1, LSL #24         ; Sign extend byte
        MOV     r1, r1, ASR #24
        SUB     r0, P, MR
        ADD     r0, r0, #2              ; Pipeline for braches
        ADD     r1, r0, r1
        B       DisplayWordArg

Opcode_Abs
Opcode_AX
Opcode_AY
        LDRB    r1, [P, #1]
        LDRB    r0, [P, #2]
        ADD     r1, r1, r0, LSL #8

; .............................................................................
; In    r1 = word

DisplayWordArg

        SWI     XOS_WriteI+space
        SWI     XOS_WriteI+"&"
        BL      HWRDHX
        BL      FindUsefulAddress
        SWIEQ   XOS_WriteI+space
        SWIEQ   XOS_Write0
        SWI     XOS_NewLine
        EXITS


DisasmOpcodeTable

        DCB     "BRK  ",0, t_One,0      ; 00
        DCB     "ORAIX",0, t_IX,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "TSBZ ",0, t_Z,0
        DCB     "ORAZ ",0, t_Z,0
        DCB     "ASLZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "PHP  ",0, t_Imp,0
        DCB     "ORAIM",0, t_IM,0
        DCB     "ASLA ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "TSB  ",0, t_Abs,0
        DCB     "ORA  ",0, t_Abs,0
        DCB     "ASL  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BPL  ",0, t_Rel,0      ; 10
        DCB     "ORAIY",0, t_IY,0
        DCB     "ORAI ",0, t_I ,0
        DCB     "aByte",0, t_Imp,0
        DCB     "TRBZ ",0, t_Z,0
        DCB     "ORAZX",0, t_ZX,0
        DCB     "ASLZX",0, t_ZX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "CLC  ",0, t_Imp,0
        DCB     "ORAAY",0, t_AY,0
        DCB     "INCA ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "TRB  ",0, t_Abs,0
        DCB     "ORAAX",0, t_AX,0
        DCB     "ASLAX",0, t_AX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "JSR  ",0, t_Abs,0      ; 20
        DCB     "ANDIX",0, t_IX,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "BITZ ",0, t_Z,0
        DCB     "ANDZ ",0, t_Z,0
        DCB     "ROLZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "PLP  ",0, t_Imp,0
        DCB     "ANDIM",0, t_IM,0
        DCB     "ROLA ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "BIT  ",0, t_Abs,0
        DCB     "AND  ",0, t_Abs,0
        DCB     "ROL  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BMI  ",0, t_Rel,0      ; 30
        DCB     "ANDIY",0, t_IY,0
        DCB     "ANDI ",0, t_I ,0
        DCB     "???  ",0, t_Imp,0
        DCB     "BITZX",0, t_ZX,0
        DCB     "ANDZX",0, t_ZX,0
        DCB     "ROLZX",0, t_ZX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "SEC  ",0, t_Imp,0
        DCB     "ANDAY",0, t_AY,0
        DCB     "DECA ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "BITAX",0, t_AX,0
        DCB     "ANDAX",0, t_AX,0
        DCB     "ROLAX",0, t_AX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "RTI  ",0, t_Imp,0      ; 40
        DCB     "EORIX",0, t_IX,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "EORZ ",0, t_Z,0
        DCB     "LSRZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "PHA  ",0, t_Imp,0
        DCB     "EORIM",0, t_IM,0
        DCB     "LSRA ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "JMP  ",0, t_Abs,0
        DCB     "EOR  ",0, t_Abs,0
        DCB     "LSR  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BVC  ",0, t_Rel,0      ; 50
        DCB     "EORIY",0, t_IY,0
        DCB     "EORI ",0, t_I ,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "EORZX",0, t_ZX,0
        DCB     "LSRZX",0, t_ZX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "CLI  ",0, t_Imp,0
        DCB     "EORAY",0, t_AY,0
        DCB     "PHY  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "EORAX",0, t_AX,0
        DCB     "LSRAX",0, t_AX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "RTS  ",0, t_Imp,0      ; 60
        DCB     "ADCIX",0, t_IX,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CLRZ ",0, t_Z,0
        DCB     "ADCZ ",0, t_Z,0
        DCB     "RORZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "PLA  ",0, t_Imp,0
        DCB     "ADCIM",0, t_IM,0
        DCB     "RORA ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "JMI  ",0, t_Abs,0
        DCB     "ADC  ",0, t_Abs,0
        DCB     "ROR  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BVS  ",0, t_Rel,0      ; 70
        DCB     "ADCIY",0, t_IY,0
        DCB     "ADCI ",0, t_I ,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CLRZX",0, t_ZX,0
        DCB     "ADCZX",0, t_ZX,0
        DCB     "RORZX",0, t_ZX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "SEI  ",0, t_Imp,0
        DCB     "ADCAY",0, t_AY,0
        DCB     "PLY  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "JMIX ",0, t_Abs,0
        DCB     "ADCAX",0, t_AX,0
        DCB     "RORAX",0, t_AX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BRA  ",0, t_Rel,0      ; 80
        DCB     "STAIX",0, t_IX,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "STYZ ",0, t_Z,0
        DCB     "STAZ ",0, t_Z,0
        DCB     "STXZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "DEY  ",0, t_Imp,0
        DCB     "BITIM",0, t_IM,0
        DCB     "TXA  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "STY  ",0, t_Abs,0
        DCB     "STA  ",0, t_Abs,0
        DCB     "STX  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BCC  ",0, t_Rel,0      ; 90
        DCB     "STAIY",0, t_IY,0
        DCB     "STAI ",0, t_I ,0
        DCB     "???  ",0, t_Imp,0
        DCB     "STYZX",0, t_ZX,0
        DCB     "STAZX",0, t_ZX,0
        DCB     "STXZY",0, t_ZY,0
        DCB     "???  ",0, t_Imp,0

        DCB     "TYA  ",0, t_Imp,0
        DCB     "STAAY",0, t_AY,0
        DCB     "TXS  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CLR  ",0, t_Abs,0
        DCB     "STAAX",0, t_AX,0
        DCB     "CLRAX",0, t_AX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "LDYIM",0, t_IM,0       ; A0
        DCB     "LDAIX",0, t_IX,0
        DCB     "LDXIM",0, t_IM,0
        DCB     "???  ",0, t_Imp,0
        DCB     "LDYZ ",0, t_Z,0
        DCB     "LDAZ ",0, t_Z,0
        DCB     "LDXZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "TAY  ",0, t_Imp,0
        DCB     "LDAIM",0, t_IM,0
        DCB     "TAX  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "LDY  ",0, t_Abs,0
        DCB     "LDA  ",0, t_Abs,0
        DCB     "LDX  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BCS  ",0, t_Rel,0      ; B0
        DCB     "LDAIY",0, t_IY,0
        DCB     "LDAI ",0, t_I ,0
        DCB     "???  ",0, t_Imp,0
        DCB     "LDYZX",0, t_ZX,0
        DCB     "LDAZX",0, t_ZX,0
        DCB     "LDXZY",0, t_ZY,0
        DCB     "???  ",0, t_Imp,0

        DCB     "CLV  ",0, t_Imp,0
        DCB     "LDAAY",0, t_AY,0
        DCB     "TSX  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "LDYAX",0, t_AX,0
        DCB     "LDAAX",0, t_AX,0
        DCB     "LDXAY",0, t_AY,0
        DCB     "???  ",0, t_Imp,0

        DCB     "CPYIM",0, t_IM,0       ; C0
        DCB     "CMPIX",0, t_IX,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CPYZ ",0, t_Z,0
        DCB     "CMPZ ",0, t_Z,0
        DCB     "DECZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "INY  ",0, t_Imp,0
        DCB     "CMPIM",0, t_IM,0
        DCB     "DEX  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CPY  ",0, t_Abs,0
        DCB     "CMP  ",0, t_Abs,0
        DCB     "DEC  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BNE  ",0, t_Rel,0      ; D0
        DCB     "CMPIY",0, t_IY,0
        DCB     "CMPI ",0, t_I ,0
        DCB     "a_INS",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CMPZX",0, t_ZX,0
        DCB     "DECZX",0, t_ZX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "CLD  ",0, t_Imp,0
        DCB     "CMPAY",0, t_AY,0
        DCB     "PHX  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CMPAX",0, t_AX,0
        DCB     "DECAX",0, t_AX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "CPXIM",0, t_IM,0       ; E0
        DCB     "SBCIX",0, t_IX,0
        DCB     "???  ",0, t_Imp,0
        DCB     "a_REM",0, t_Imp,0
        DCB     "CPXZ ",0, t_Z,0
        DCB     "SBCZ ",0, t_Z,0
        DCB     "INCZ ",0, t_Z,0
        DCB     "???  ",0, t_Imp,0

        DCB     "INX  ",0, t_Imp,0
        DCB     "SBCIM",0, t_IM,0
        DCB     "NOP  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "CPX  ",0, t_Abs,0
        DCB     "SBC  ",0, t_Abs,0
        DCB     "INC  ",0, t_Abs,0
        DCB     "???  ",0, t_Imp,0

        DCB     "BEQ  ",0, t_Rel,0      ; F0
        DCB     "SBCIY",0, t_IY,0
        DCB     "SBCI ",0, t_I ,0
        DCB     "a_CNP",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "SBCZX",0, t_ZX,0
        DCB     "INCZX",0, t_ZX,0
        DCB     "???  ",0, t_Imp,0

        DCB     "SED  ",0, t_Imp,0
        DCB     "SBCAY",0, t_AY,0
        DCB     "PLX  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "???  ",0, t_Imp,0
        DCB     "SBCAX",0, t_AX,0
        DCB     "INCAX",0, t_AX,0
        DCB     "???  ",0, t_Imp,0

 assert .-DisasmOpcodeTable = 8*256

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    r1 = address

; Out   EQ: r0 -> string to Write0
;       NE: r0 preserved

FindUsefulAddress ENTRY "r1-r3"

        ADR     r2, UsefulAddresses
10      LDR     r14, [r2], #4
        CMP     r14, r1
        MOVEQ   r0, r2
        EXIT    EQ

        CMP     r14, #-1
        BEQ     %FT90

20      LDRB    r14, [r2], #1
        CMP     r14, #0
        BNE     %BT20

        ADD     r2, r2, #3              ; Round up to next word
        BIC     r2, r2, #3
        B       %BT10

90      CMP     pc, #0                  ; NE
        EXIT


        MACRO
        Useful  $value, $string
        DCD     $value
        DCB     "$string", 0
        ALIGN
        MEND


UsefulAddresses

        Useful  &FFB9, OSRDRM
        Useful  &FFBC, rawvdu
        Useful  &FFBF, OSEven
        Useful  &FFC2, GSInit
        Useful  &FFC5, GSRead
        Useful  &FFC8, nvrdch
        Useful  &FFCB, nvwrch
        Useful  &FFCE, OSFind
        Useful  &FFD1, OSGBPB           ; OS_GrahamBartram_PotBelly ?
        Useful  &FFD4, OSBPut           ; Gosh, you are nasty sometimes Swales!
        Useful  &FFD7, OSBGet
        Useful  &FFDA, OSArgs
        Useful  &FFDD, OSFile
        Useful  &FFE0, OSRdch
        Useful  &FFE3, OSASCI
        Useful  &FFE7, OSNewl
        Useful  &FFEE, OSWrch
        Useful  &FFF1, OSWord
        Useful  &FFF4, OSByte
        Useful  &FFF7, OSCLI

        Useful  &0200, UserV
        Useful  &0202, BRKV
        Useful  &0204, Irq1V
        Useful  &0206, Irq2V
        Useful  &0208, CLIV
        Useful  &020A, ByteV
        Useful  &020C, WordV
        Useful  &020E, WrchV
        Useful  &0210, RdchV
        Useful  &0212, FileV
        Useful  &0214, ArgsV
        Useful  &0216, BGetV
        Useful  &0218, BPutV
        Useful  &021A, GBPBV
        Useful  &021C, FindV
        Useful  &021E, FSCV
        Useful  &0220, EventV
        Useful  &0222, UPTV
        Useful  &0224, NETV
        Useful  &0226, VDUV
        Useful  &0228, KEYV
        Useful  &022A, INSV
        Useful  &022C, REMV
        Useful  &022E, CNPV
        Useful  &0230, IND1V
        Useful  &0232, IND2V
        Useful  &0234, IND3V

        DCD     -1                      ; End of table

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; writeln, writes
; ===============
;
; Write a 'string', optional newline

; In    r1 -> CtrlChar terminated string

writeln ENTRY

        DREG    r1,,cc
        DSTRING r1," "
        EXITS


writes  ENTRY   "r0, r1"

        DREG    r1,,cc
        DSTRING r1," ",cc
        EXITS


        InsertDebugRoutines
 ]

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; print r1 BYTE

BYTEHX  MOV     r2, #8-4
        B       WORDLP

; print r1 16bits

HWRDHX  MOV     r2, #16-4
        B       WORDLP

; print r1 WORD

WORDHX  MOV     r2, #32-4
WORDLP  MOV     r0, r1, LSR r2
        AND     r0, r0, #15
        CMP     r0, #10
        ADDLO   r0, r0, #"0"
        ADDHS   r0, r0, #"A"-10
        SWI     XOS_WriteC
        SUBS    r2, r2, #4
        BPL     WORDLP
        MOV     pc, lr

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; End of emulator code per se

        LTORG

Emulator_ModuleEnd ; Where end of runnable code is. CAO never in OS or lang ROM

 [ debug
 DCB "6502 OS starts here" ; So we can find the OS and info block if needs be !
 ]

                ALIGN

                ^       .               ; Images get strapped on here

OSLength        #       4
OSOrigin        #       4
OSCode          #       0

; After OSLength bytes of OSCode, comes ...

;LangLink       #       4
;LangOrigin     #       4               ; Always &4000 bytes long

        END
